package com.kaifamiao.month03.day0324;

public class CommonMultiples {

    public static void main(String[] args) {
        int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        System.out.println(commonMultiples(nums));
        System.out.println(commonMultiples2(nums));
    }

    /**
     * 找到最小公倍数 第一种方法，假设最大的数是最小公倍数，如果遇到不能整除的，每次加上最大的数字
     * @param nums 找最小公倍数的数组
     * @return 找到的最小公倍数
     */
    public static int commonMultiples(int[] nums){
        int max = getMax(nums);
        for(int result = max; ;result += max){ // 假设最小公倍数是最大的值，每次加上最大的数值
            boolean flag = true; // 设置标识 代表已经找到了最小公倍数
            for(int num : nums){
                if (result % num != 0) {
                    flag = false; // 如果不能整除，表示不符合要求，改变标识
                    break;
                }
            }
            if(flag){
                return result;
            }
        }
    }

    /**
     * 找出数组中最大的值
     * @param nums 查找的数组
     * @return 最大值
     */
    public static int getMax(int[] nums){
        int max = nums[0];
        for(int i = 1; i < nums.length; i ++){
            if(nums[i] > max){
                max = nums[i];
            }
        }
        return max;
    }

    // 方法二：两两相乘，除以最大公约数
    /**
     * 寻找最大公约数
     * @param prev 第一个数字
     * @param next 第二个数字
     * @return 找到的最大公约数
     */
    public static int commonDivisor(int prev, int next){
        int min = prev < next ? prev : next;
        for(int divisor = min; divisor > 0; divisor --){
            if(prev % divisor == 0 && next % divisor == 0){
                return divisor;
            }
        }
        return 1;
    }

    /**
     * 计算最小公倍数
     * @param nums 需要查找的数组
     * @return 找到的最小公倍数
     */
    public static int commonMultiples2(int[] nums){
        int result = nums[0];
        for(int i = 0; i < nums.length - 1; i ++){
            result = (result* nums[i + 1]) / commonDivisor(result,nums[i + 1]);
        }
        return result;
    }
}
